home *** CD-ROM | disk | FTP | other *** search
/ Dictionaries & Language / Dictionaries and Language (Chestnut CD-ROM) (1993).iso / german / germanl / trans.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1988-03-31  |  28.0 KB  |  1,002 lines

  1. {$R-}    {Range checking off}
  2. {$B+}    {Boolean complete evaluation on}
  3. {$S+}    {Stack checking on}
  4. {$I+}    {I/O checking on}
  5. {$N-}    {No numeric coprocessor}
  6. {$M 65500,16384,655360} {Turbo 3 default stack and heap}
  7.  
  8. PROGRAM TRANSLATE;
  9.  
  10.  
  11.  
  12. Uses
  13.   Crt;
  14.  
  15. CONST
  16.      STRINGSIZE = 80 ;
  17.      COMMANDSIZE = 80;
  18.      MAXSIZE = 80;
  19.      SPACE = ' ';
  20.      SENTINEL = '';
  21.      VOCABLENGTH = 25;
  22.  
  23.  TYPE
  24.      STRING_80 = string[STRINGSIZE];
  25.      Placetype = ARRAY [0..12] of STRING_80 ;
  26.      Vocabtype = ARRAY [1..350] of STRING_80 ;
  27.      Deftype = ARRAY [1..350] of STRING_80 ;
  28.      Choices = set of 1..10;
  29.      STACKTYPE = ^STACKNODE;
  30.      STACKNODE = record
  31.      LEVEL:  INTEGER;
  32.      WORD:  STRING_80;
  33. {! 1.^ The SYSTEM unit now uses this name as a standard identifier.}
  34.      SAME, SUB, NEXT  : STACKTYPE
  35.    end;
  36.  
  37.  VAR
  38.      INPUT    : STRING_80;
  39.      ANSWER1   : STRING_80;
  40.      QUESTNUM : STRING_80;
  41.      QUESTCNT : INTEGER;
  42.      Nums  : Choices;
  43.      SpacePos  : INTEGER;
  44.      WordCnt : INTEGER;
  45.      Rnd : INTEGER;
  46.      NonRepeatArray : Array[1..Vocablength] of INTEGER;
  47.      TRANSLATFile :  Text{[$800]};
  48. {! 2. Use the new standar^d procedure SetTextBuf to set Text buffer size.}
  49.      COUNT     :  integer;
  50.      Counter   :  integer;
  51.      Counter1  :  integer;
  52.      Counter2  :  integer;
  53.      KOUNTER,KOUNTER1,KOUNTER2,KOUNTER3   :  INTEGER;
  54.      CORRECTARRAY : ARRAY[1..100] of string_80;
  55.      VOCABULARY : ARRAY[1..25] of string_80;
  56.      Prepart   :  STRING_80;
  57.      Object    :  STRING_80;
  58.      Object1   :  STRING_80;
  59.      Verb      :  STRING_80;
  60.      Line      :  STRING_80;
  61.      Instring  :  STRING_80;
  62.      COMM : STRING_80;
  63.      ROOT :  STACKTYPE;
  64.      STUFF   : STACKNODE;
  65.      INFILE  : TEXT;
  66.      OUTFILE : TEXT;
  67.      INT1    : INTEGER;
  68.      INSTR1  : STRING_80;
  69.      INST    : STRING_80;
  70.      X       : BOOLEAN;
  71.      CONT    : STRING_80;
  72.      CH      : CHAR;
  73.      INDEX   : INTEGER;
  74.      FLAG1,FLAG2,FLAG3,FLAG4 : BOOLEAN;
  75.      FIRST, SECOND, THIRD, FOURTH:  BOOLEAN;
  76.      FLAGEXIT, FLAGADD : BOOLEAN;
  77.      SAVESTR1, SAVESTR2, SAVESTR3, SAVESTR4, SAVESTR5 : STRING_80;
  78.      FIRST_ELEMENT, SECOND_ELEMENT,THIRD_ELEMENT,FOURTH_ELEMENT, FIFTH_ELEMENT  : STRING_80;
  79.      UTILNUM, NUM1, NUM2, NUM3, NUM4, NUM5 : INTEGER;
  80.      HOR : INTEGER;
  81.      LETTER : CHAR;
  82.      Y  : INTEGER;
  83.      doloop  : boolean ;
  84.      doloop1 : boolean ;
  85.      encompassingLoop : boolean;
  86.      command : STRING_80 ;
  87.      skeleton : STRING_80;
  88.      word     : STRING_80;
  89.      word1    : STRING_80;
  90.      Lesson_Number : STRING_80;
  91.      WordCnt1 : INTEGER;
  92.      temp     :  INTEGER;
  93.      Answer   :  STRING[20];
  94.      Result   :  INTEGER;
  95.  (****************************************************************************)
  96. {Procedure Parse(var comm : string_80);
  97.  
  98. const
  99.   Space     = ' ';
  100.  
  101. var
  102.   Indx,Len  :  Integer;
  103.  
  104. begin
  105.    Len:=0;
  106.    while Pos(Space,comm)=1 do
  107.       Delete(comm,1,1);
  108.       Len:=Pos(Space,comm);
  109.       Instring := Copy(comm,1,Len-1);
  110.       Delete(comm,1,Len);
  111.    end; }
  112.    (*********************************************************************)
  113.    procedure CreateWindow(X1,Y1,X2,Y2:  integer);
  114.  
  115.  
  116. var
  117.   border:  integer;
  118.  
  119. BEGIN
  120.  
  121.   window(1,1,80,25);
  122.   GoToXY(X1,Y1) ; Write('┌'); GoToXY(X1,Y2); Write('└');
  123.   For border  := (X1+1) to (X2-1) do
  124.     begin
  125.       GoToXY(border,Y1); Write('─');
  126.       GoToXY(border,Y2); Write('─')
  127.     end;
  128.   GoToXY(X2,Y1); write('┐'); GoToXY(X2,Y2); Write('┘');
  129.   for border :=(Y1+1) to (Y2-1) do
  130.     begin
  131.       GoToXY(X1,border); write('│');
  132.       GoToXY(X2,border); write ('│')
  133.     end;
  134.   window(X1+1, Y1+1, X2-1, Y2-1);
  135.   ClrScr;
  136.   gotoXY(1,1);
  137.  
  138. END;
  139.  
  140.  
  141.  
  142. procedure MAKE(var STACK : STACKTYPE);
  143.  
  144. begin
  145.   STACK := NIL
  146. end;
  147.  
  148.  
  149.   function GETREC(var WORKINT: INTEGER;var  WORKSTR:  STRING_80;
  150.                 var WORKFILE: TEXT): boolean;
  151.    begin
  152.         if not EOF(WORKFILE) then
  153.             begin
  154.               readln(WORKFILE, WORKINT);
  155.               readln(WORKFILE, WORKSTR);
  156.               GETREC := TRUE
  157.             end
  158.         else begin
  159.                GETREC := FALSE
  160.              end
  161.    end;
  162.  
  163. function SCANTREE(var WRKINT : INTEGER ; WRKSTR : STRING_80;
  164.                   var BEGINPTR : STACKTYPE;
  165.                   var SUBPTR   : STACKTYPE): boolean;
  166.  
  167. var
  168.   SCANPTR  :  STACKTYPE;
  169.   TRAILPTR :  STACKTYPE;
  170.  
  171. begin
  172.   if (BEGINPTR = NIL) then begin
  173.        SCANTREE := FALSE
  174.      end
  175.    else begin
  176.      TRAILPTR := BEGINPTR;
  177.      SCANPTR  := BEGINPTR;
  178.      if (WRKINT <> SCANPTR^.LEVEL) then begin
  179.        SCANPTR := SCANPTR^.SUB;
  180.      end;
  181.      if (SCANPTR = NIL) then
  182.        begin
  183.          SCANTREE := FALSE;
  184.          SUBPTR := TRAILPTR
  185.        end
  186.        else begin
  187.          while ((SCANPTR <> NIL) and (SCANPTR^.WORD <> WRKSTR)) do
  188.            begin
  189.              TRAILPTR := SCANPTR;
  190.              SCANPTR := SCANPTR^.SAME
  191.            end;
  192.            if (SCANPTR = NIL) then begin
  193.              SCANTREE := FALSE;
  194.              SUBPTR := TRAILPTR
  195.            end
  196.            else begin
  197.              SCANTREE := TRUE;
  198.              SUBPTR := SCANPTR
  199.            end
  200.        end
  201.    end
  202. end;
  203.  
  204.  
  205.  
  206.  
  207.  
  208. function ISBRANCH(var ININT1 : INTEGER ; var INSTR1 : STRING_80;
  209.                   var ININT2 : INTEGER ; var INSTR2 : STRING_80;
  210.                   var ININT3 : INTEGER ; var INSTR3 : STRING_80;
  211.                   var ININT4 : INTEGER ; var INSTR4 : STRING_80;
  212.                   var ININT5 : INTEGER ; var INSTR5 : STRING_80;
  213.                   var ROOT   : STACKTYPE): boolean;
  214.  
  215. var
  216.   SCANPTR1, ISPTR1, ISPTR2, ISPTR3, ISPTR4, ISPTR5 : STACKTYPE;
  217.   INPUT : STRING_80;
  218.  
  219. begin
  220.   ISBRANCH := FALSE;
  221.   if not SCANTREE(ININT1, INSTR1, ROOT, ISPTR1) then begin
  222.     CreateWindow(1,12,80,23);
  223.     TextColor(15);
  224.     writeln('False First Element.');
  225.     WRITELN('Use one of the following elements: ');
  226.     SCANPTR1:=ROOT;
  227.     while SCANPTR1 <> nil do begin
  228.       WRITE(SCANPTR1^.WORD+'  ');
  229.       SCANPTR1 := SCANPTR1^.SAME;
  230.     end;
  231.     writeln;
  232.     writeln('PRESS RETURN TO CONTINUE');
  233.     readln(INPUT);
  234.     ClrScr;
  235.     CreateWindow(1,1,80,11);
  236.     GotoXY(1,1);
  237.     ClrScr
  238.   end
  239.   else begin
  240.     if not SCANTREE(ININT2, INSTR2, ISPTR1, ISPTR2) then begin
  241.     CreateWindow(1,12,80,23);
  242.     TextColor(15);
  243.       writeln('False Second Element.');
  244.       writeln('With First Element "',First_element,'" use the following next element:');
  245.       SCANPTR1:=ISPTR1^.SUB;
  246.       while SCANPTR1<>nil do begin
  247.         WRITE(SCANPTR1^.WORD+'  ');
  248.         SCANPTR1 := SCANPTR1^.SAME
  249.       end;
  250.       writeln;
  251.       writeln('PRESS RETURN TO CONTINUE');
  252.       readln(INPUT);
  253.       ClrScr;
  254.       CreateWindow(1,1,80,11);
  255.       GotoXY(1,1);
  256.       ClrScr
  257.     end
  258.     else begin
  259.       if not SCANTREE(ININT3, INSTR3, ISPTR2, ISPTR3) then begin
  260.       CreateWindow(1,12,80,23);
  261.       TextColor(15);
  262.         writeln('False Third Element.');
  263.         writeln('With First Element "',First_element,'" and Second Element "',Second_element,'"');
  264.         writeln('Use the following element:');
  265.         SCANPTR1:=ISPTR2^.SUB;
  266.         while SCANPTR1<>nil do begin
  267.           WRITE(SCANPTR1^.WORD+'  ');
  268.           SCANPTR1 := SCANPTR1^.SAME
  269.         end;
  270.         writeln;
  271.         writeln('PRESS RETURN TO CONTINUE');
  272.         readln(INPUT);
  273.         ClrScr;
  274.         CreateWindow(1,1,80,11);
  275.         GotoXY(1,1);
  276.         ClrScr
  277.       end
  278.       else begin
  279.         if not SCANTREE(ININT4, INSTR4, ISPTR3, ISPTR4) then begin
  280.         CreateWindow(1,12,80,23);
  281.         TextColor(15);
  282.         if INSTR3='na' then
  283.           begin
  284.  
  285.             writeln('With first element "',First_element,'" and second element "',Second_element,'"');
  286.             writeln(' use the article:');
  287.             SCANPTR1:=ISPTR3^.SUB;
  288.              while SCANPTR1<>nil do begin
  289.                WRITE(SCANPTR1^.WORD+'  ');
  290.                WRITELN(INSTR1 + ' '+ INSTR2 +' '+SCANPTR1^.WORD);
  291.                SCANPTR1 := SCANPTR1^.SAME
  292.              end
  293.            end
  294.         else
  295.           begin
  296.             writeln('False Fourth Element.');
  297.             writeln('With First element "',First_Element,'",Second Element "',Second_Element,'"');
  298.             writeln('and Third Element "',Third_Element,'" use following Fourth Elements:');
  299.             SCANPTR1:=ISPTR3^.SUB;
  300.               while SCANPTR1<>nil do begin
  301.               WRITELN(SCANPTR1^.WORD);
  302.               WRITELN(INSTR1+' '+INSTR2 +' '+ INSTR3 +' '+SCANPTR1^.WORD);
  303.               SCANPTR1 := SCANPTR1^.SAME
  304.             end
  305.           end;
  306.         writeln('PRESS RETURN TO CONTINUE');
  307.         readln(INPUT);
  308.         ClrScr;
  309.         CreateWindow(1,1,80,11);
  310.         GotoXY(1,1);
  311.         ClrScr
  312.       end
  313.       else begin
  314.       if not SCANTREE(ININT5, INSTR5, ISPTR4, ISPTR5) then begin
  315.       CreateWindow(1,12,80,23);
  316.       TextColor(15);
  317.         writeln('Correct sentence but incorrect translation.');
  318.         writeln('Please try again.');
  319.         writeln;
  320.         writeln('PRESS RETURN TO CONTINUE');
  321.         readln(INPUT);
  322.         ClrScr;
  323.         CreateWindow(1,1,80,11);
  324.         GotoXY(1,1);
  325.         ClrScr
  326.       end
  327.         else ISBRANCH := TRUE
  328.         end
  329.       end
  330.     end
  331.   end
  332. end;
  333.  
  334. procedure ADDLEAVES(var BRANCH  : STACKTYPE; var PASSLEAF: STACKTYPE;
  335.                      var PASSFILE : TEXT);
  336.  
  337. var
  338.   TEMPLEAF   :  STACKTYPE;
  339.   ININT      :  INTEGER;
  340.   INSTR      :  STRING_80;
  341.   FLAGEND    :  BOOLEAN;
  342.   INFILE     :  TEXT;
  343.  
  344. begin
  345.     if not GETREC(ININT, INSTR, PASSFILE) then PASSLEAF := NIL
  346.     else
  347.       begin
  348.         NEW(TEMPLEAF);
  349.         TEMPLEAF^.SAME:=NIL;
  350.         TEMPLEAF^.SUB:=NIL;
  351.         TEMPLEAF^.LEVEL  := ININT;
  352.         TEMPLEAF^.WORD := INSTR;
  353.         if TEMPLEAF^.LEVEL > BRANCH^.LEVEL then
  354.           begin
  355.             BRANCH^.SUB  := TEMPLEAF;
  356.             ADDLEAVES(BRANCH^.SUB, PASSLEAF, PASSFILE);
  357.             TEMPLEAF := PASSLEAF
  358.           end;
  359.         if ((TEMPLEAF <> NIL) AND (TEMPLEAF^.LEVEL = BRANCH^.LEVEL)) then
  360.           begin
  361.             BRANCH^.SAME := TEMPLEAF;
  362.             ADDLEAVES(BRANCH^.SAME, PASSLEAF, PASSFILE);
  363.             TEMPLEAF := PASSLEAF
  364.           end;
  365.         if ((TEMPLEAF <> NIL) AND (TEMPLEAF^.LEVEL < BRANCH^.LEVEL)) then
  366.           begin
  367.             PASSLEAF := TEMPLEAF
  368.           end;
  369.      end;
  370. end;
  371.  
  372. procedure RECALLTREE (var LEAF  :  STACKTYPE);
  373.  
  374.   var
  375.     TEMPREC, PASSREC : STACKTYPE;
  376.     WORKINT  : INTEGER;
  377.     WORKSTR  : STRING_80;
  378.     INFILE   : TEXT;
  379.  
  380. begin
  381.         ASSIGN(INFILE, Lesson_Number+'.tre');
  382.         RESET(INFILE);
  383.         X :=GETREC(WORKINT,WORKSTR,INFILE);
  384.         NEW(TEMPREC);
  385.         TEMPREC^.SAME:=NIL;
  386.         TEMPREC^.SUB:=NIL;
  387.         TEMPREC^.LEVEL := WORKINT;
  388.         TEMPREC^.WORD := WORKSTR;
  389.         LEAF  :=  TEMPREC;
  390.         PASSREC := NIL;
  391.         ADDLEAVES(LEAF, PASSREC, INFILE);
  392.         CLOSE(INFILE)
  393. end;
  394.  
  395. Procedure CreateOrder(Instring: String_80);
  396.  
  397.  
  398. begin
  399.   Count := Count +1;
  400.   If Count = 1 then
  401.     begin
  402.       First_element := Instring;
  403.       write(First_Element+'  ')
  404.     end;
  405.   If Count = 2 then
  406.     begin
  407.       Second_Element := Instring;
  408.       If Second_Element = First_Element
  409.         then
  410.           begin
  411.             Second_Element := '';
  412.             Count := Count -1
  413.           end;
  414.       Write(Second_Element+'  ')
  415.    end;
  416.   If Count = 3 then
  417.     begin
  418.       Third_Element := Instring;
  419.       If Third_Element = Second_Element
  420.         then
  421.           begin
  422.             Third_Element := '';
  423.             Count := Count -1
  424.           end;
  425.       Write(Third_Element+'  ')
  426.     end;
  427.   If Count = 4 then
  428.     begin
  429.       Fourth_element := Instring;
  430.       If Fourth_Element = Third_Element
  431.         then
  432.           begin
  433.             Fourth_Element := '';
  434.             Count := Count -1
  435.           end;
  436.       Write(Fourth_Element+'  ')
  437.     end
  438. end;
  439.  
  440.  
  441. function FINDBRANCH (var W, X, Y, Z, V : INTEGER;
  442.                      var OUTSTRNG1, OUTSTRNG2, OUTSTRNG3, OUTSTRNG4, OUTSTRNG5, Instring: STRING_80;
  443.                      var STEM : STACKTYPE): boolean;
  444.  
  445.  
  446. var
  447.   FINDPTR   : STACKTYPE;
  448.   FLAG      : boolean;
  449.   A,B,C,D,E : INTEGER;
  450.  
  451. begin
  452.   FLAG := TRUE;
  453.   A := W; B := X; C := Y; D := Z; E := V;
  454.   OUTSTRNG1:='EMPTY';OUTSTRNG2:='EMPTY';
  455.   OUTSTRNG3:='EMPTY';OUTSTRNG4:='EMPTY';OUTSTRNG5:='EMPTY';
  456.   FINDPTR := STEM;
  457.   while ((W <> 1) and (FINDPTR <> NIL)) do
  458.     begin
  459.       FINDPTR := FINDPTR^.SAME;
  460.       W := W - 1
  461.     end;
  462.   W := A;
  463.   if FINDPTR = NIL then FLAG := FALSE
  464.   else
  465.     begin
  466.       OUTSTRNG1 := FINDPTR^.WORD;
  467.       FINDPTR   := FINDPTR^.SUB;
  468.       while ((X <> 1) and (FINDPTR <> NIL)) do
  469.         begin
  470.           FINDPTR := FINDPTR^.SAME;
  471.           X := X - 1
  472.         end;
  473.         X := B;
  474.         if FINDPTR = NIL then FLAG := FALSE
  475.         else
  476.           begin
  477.             OUTSTRNG2 := FINDPTR^.WORD;
  478.             FINDPTR   := FINDPTR^.SUB;
  479.             while ((Y <> 1) and (FINDPTR <> NIL)) do
  480.               begin
  481.                 FINDPTR := FINDPTR^.SAME;
  482.                 Y := Y - 1;
  483.               end;
  484.               Y := C;
  485.               if FINDPTR = NIL then FLAG := FALSE
  486.               else
  487.                 begin
  488.                   OUTSTRNG3 := FINDPTR^.WORD;
  489.                   FINDPTR   := FINDPTR^.SUB;
  490.                   while ((Z <> 1) and (FINDPTR <> NIL)) do
  491.                     begin
  492.                       FINDPTR := FINDPTR^.SAME;
  493.                       Z := Z - 1;
  494.                     end;
  495.                     Z := D;
  496.                     if FINDPTR = NIL then FLAG := FALSE
  497.                     else
  498.                       begin
  499.                         OUTSTRNG4 := FINDPTR^.WORD;
  500.                         FINDPTR   := FINDPTR^.SUB;
  501.                       end;
  502.                         while ((V <> 1) and (FINDPTR <> NIL)) do
  503.                           begin
  504.                             FINDPTR := FINDPTR^.SAME;
  505.                             V := V - 1;
  506.                           end;
  507.                           V := E;
  508.                           if FINDPTR = NIL then FLAG := FALSE
  509.                           else
  510.                              begin
  511.                                OUTSTRNG5 := FINDPTR^.WORD;
  512.                                FINDPTR   := FINDPTR^.SUB;
  513.                              end
  514.                 end
  515.           end
  516.     end;
  517.   if FLAG then FINDBRANCH := TRUE
  518.       else FINDBRANCH := FALSE
  519. end;
  520.  
  521.  
  522.  
  523.  
  524.  
  525. procedure PRINTTREE(var INSTRING : STRING_80; var STEM : STACKTYPE);
  526.  
  527. var
  528.   FLAGEND   : BOOLEAN;
  529.   Q,R,S,T,U : INTEGER;
  530.   PRNTSTR1, PRNTSTR2, PRNTSTR3, PRNTSTR4, PRNTSTR5: STRING_80;
  531.  
  532.  
  533.  
  534. begin
  535.   FLAGEND := FALSE;
  536. {  WRITELN('BEGIN PRINTING ALL COMBINATIONS:');}
  537.   Q :=1; R:=1; S:=1; T:=1; U:=1;
  538.   while not FLAGEND do begin
  539.     if FINDBRANCH(Q,R,S,T,U,PRNTSTR1,PRNTSTR2,PRNTSTR3,
  540.     PRNTSTR4,PRNTSTR5,INSTRING,STEM) then begin
  541.     if ((QUESTNUM =PRNTSTR5) AND((INSTRING = PRNTSTR1)OR(INSTRING = PRNTSTR2)
  542.     OR(INSTRING=PRNTSTR3)OR(INSTRING = PRNTSTR4))) then CreateOrder(Instring);
  543.  
  544.     {  WRITEln('First Element =',First_Element);
  545.       WRITEln('Second Element =',Second_Element);
  546.       WRITEln('Third Element =',Third_Element);
  547.       WRITELN('Fourth Element =',Fourth_element);}
  548.       T := T + 1
  549.     end
  550.     else begin
  551.       if(PRNTSTR1='EMPTY') then FLAGEND := TRUE
  552.       else begin
  553.         if(PRNTSTR2='EMPTY') then begin
  554.           Q := Q+1;
  555.           R := 1;
  556.         end
  557.           else begin
  558.             if(PRNTSTR3='EMPTY') then begin
  559.               R := R+1;
  560.               S := 1
  561.             end
  562.               else begin
  563.                 if(PRNTSTR4='EMPTY') then begin
  564.                   S := S+1;
  565.                   T := 1
  566.                 end
  567.                   else begin
  568.                     if (PRNTSTR5='EMPTY') then begin
  569.                       T := T+1;
  570.                       U := 1
  571.                     end
  572.                   end
  573.               end
  574.           end
  575.       end
  576.     end
  577.   end
  578. end;
  579.  
  580. procedure PRINTTREE1(var INSTRING : STRING_80; var STEM : STACKTYPE);
  581.  
  582. var
  583.   FLAGEND   : BOOLEAN;
  584.   Q,R,S,T,U : INTEGER;
  585.   PRNTSTR1, PRNTSTR2, PRNTSTR3, PRNTSTR4, PRNTSTR5: STRING_80;
  586.  
  587.  
  588.  
  589. begin
  590.   FLAGEND := FALSE;
  591. {  WRITELN('BEGIN PRINTING ALL COMBINATIONS:');}
  592.   Q :=1; R:=1; S:=1; T:=1; U:=1;
  593.   while not FLAGEND do begin
  594.     if FINDBRANCH(Q,R,S,T,U,PRNTSTR1,PRNTSTR2,PRNTSTR3,
  595.     PRNTSTR4,PRNTSTR5,INSTRING,STEM) then begin
  596.     if PRNTSTR5 = QUESTNUM then QUESTCNT := QUESTCNT +1;
  597.  
  598.     {  WRITEln('First Element =',First_Element);
  599.       WRITEln('Second Element =',Second_Element);
  600.       WRITEln('Third Element =',Third_Element);
  601.       WRITELN('Fourth Element =',Fourth_element);}
  602.       T := T + 1
  603.     end
  604.     else begin
  605.       if(PRNTSTR1='EMPTY') then FLAGEND := TRUE
  606.       else begin
  607.         if(PRNTSTR2='EMPTY') then begin
  608.           Q := Q+1;
  609.           R := 1;
  610.         end
  611.           else begin
  612.             if(PRNTSTR3='EMPTY') then begin
  613.               R := R+1;
  614.               S := 1
  615.             end
  616.               else begin
  617.                 if(PRNTSTR4='EMPTY') then begin
  618.                   S := S+1;
  619.                   T := 1
  620.                 end
  621.                   else begin
  622.                     if (PRNTSTR5='EMPTY') then begin
  623.                       T := T+1;
  624.                       U := 1
  625.                     end
  626.                   end
  627.               end
  628.           end
  629.       end
  630.     end
  631.   end
  632. end;
  633.  
  634. Procedure Parse(var comm : string_80);
  635.  
  636. const
  637.   Space     = ' ';
  638.   Question  = '?';
  639.   Period    = '.';
  640.   Exclamation = '!';
  641.  
  642.  
  643. var
  644.   Indx,Len  :  Integer;
  645.   Rep, Instring       : string_80;
  646.   Substitute, Substitute1 : string_80;
  647.  
  648. begin
  649.    Len:=0;
  650.    Rep := '';
  651.    Instring := '';
  652.    while Pos(Space,comm)=1 do
  653.    Delete(comm,1,1);
  654.    Len := Pos(Space,Comm);
  655.    substitute1 := comm;
  656.    delete(substitute1,1,Len);
  657.  
  658.    Repeat
  659.      substitute := comm;
  660.      Len:=Pos(Space,comm);
  661.      Rep := Instring;
  662.      Instring := Copy(comm,1,Len-1);
  663.      If rep <> '' then
  664.      Instring := rep  + ' ' + instring;
  665.      {writeln('Instring=',Instring,'!');}
  666.      Printtree(Instring, root);
  667.      {if Isbranch(num1,Instring,num2,Instring,num3,Instring,num4,Instring,num5,Questnum,root)
  668.  
  669.                 then write('FOLLOWING BRANCH IS ON TREE:',Instring);}
  670.      Delete(substitute,1,Len);
  671.      comm := substitute;
  672.    {  writeln('Instring =',Instring,'!');}
  673.    until pos(Space,comm) = 0;
  674.    If Instring <> '' then
  675.    Instring := Instring + ' ' + comm;
  676.   { writeln('Instring =',Instring,'!');}
  677.    Printtree(Instring,root);
  678.    {if Isbranch(num1,Instring,Num2,Instring,Num3,Instring,Num4,Instring,Num5,Questnum,root)
  679.                 then write('FOLLOWING BRANCH IS ON TREE:',Instring);}
  680.    If pos(Space, substitute1) = 0 then
  681.       begin
  682.         Instring := comm;
  683.        { writeln('last Instring =',Instring);}
  684.         Printtree(Instring,root);
  685.         {if Isbranch(num1,Instring,Num2,Instring,num3,Instring,num4,Instring,Num5,Questnum,root)
  686.                 then write('FOLLOWING BRANCH IS ON TREE:', Instring)}
  687.       end;
  688.    While pos(Space,substitute1) <>0 do
  689.    Parse(substitute1);
  690.  end;
  691.  
  692.  
  693.  
  694. (* Procedure writeout(outtext: STRING_80) ;
  695.  
  696.  Begin
  697.      GotoXY(((80-length(outtext) + 2) div 2),k);
  698.      writeln(outtext)
  699.  End; *)
  700.  
  701.  
  702.  
  703.  (***************************************************************************)
  704.  
  705.  
  706.  
  707.  (***************************************************************************)
  708. Procedure inputline(var  instring  : string_80);
  709. var
  710.   key  :  byte;
  711.   FuncKey  : boolean;
  712.   inchar : char;
  713.  
  714. function getkey : Byte;
  715.  
  716. begin
  717.   FuncKey := false;
  718.   repeat until KeyPressed;
  719.     if KeyPressed then
  720.       begin
  721.        letter := ReadKey;
  722. {! 3. USE TUR^BO3 unit for access to KBD, or instead USE CRT and ReadKey.}
  723.         if letter = #0 then
  724.           begin
  725.             letter := ReadKey;
  726. {! 4. USE TURBO3 ^unit for access to KBD, or instead USE CRT and ReadKey.}
  727.             FuncKey := true;
  728.           end
  729.       end;
  730.       key:=ord(letter);
  731.       Case key of
  732.         01 : key := 132;
  733.         15 : key := 148;
  734.         21 : key := 129
  735.       end;
  736.       if FuncKey then
  737.         begin
  738.           Case key of
  739.             01 : key := 132 ;
  740.             30 : key := 142 ;
  741.             15 : key := 148 ;
  742.             24 : key := 153 ;
  743.             21 : key := 129 ;
  744.             22 : key := 154 ;
  745.             31 : key := 225 ;
  746.           end
  747.         end;
  748.         GetKey := key;
  749.  
  750.        end;
  751.  
  752. begin
  753.   instring := '';
  754.   Repeat
  755.     inchar := chr(Getkey) ;
  756.          If (key = 8) then
  757.             begin
  758.               Delete(instring,length(instring),1);
  759.               gotoXY(Hor,WhereY);
  760.               ClrEol;
  761.               write(instring)
  762.             end
  763.          Else if (key <> 8) then instring := instring + inchar ;
  764.     If (((key <> 13) or (length(instring) <> 80))and (key<>8)) then write(inchar)
  765.   Until ((key = 13) or (length(instring)=80)) ;
  766.   If (key = 13) then Delete(instring,length(instring),1);
  767.     If length(instring)<> 0 then
  768.       begin
  769.         while Copy(instring,length(instring),1) = chr(32) do
  770.         delete(instring,length(instring),1);
  771.         while pos(space,instring)=1 do
  772.         Delete(instring,1,1)
  773.       end
  774. End ;
  775.  
  776.  
  777. Procedure CheckArray;
  778.  
  779.   Var
  780.     InArray    :  Boolean;
  781.     CheckString4  :  String_80;
  782.     CheckString3  :  String_80;
  783.     CheckString2  :  String_80;
  784.     Len4          :  Integer;
  785.     Len3          :  Integer;
  786.     Len2          :  Integer;
  787.  
  788. begin
  789.   CheckString4 := First_Element +' '+Second_element +' '+Third_Element +' '+Fourth_Element;
  790.   Len4 := Length(CheckString4);
  791.   delay(2000);
  792.   CheckString3 := First_Element +' '+Second_element +' '+Third_Element;
  793.   Len3 := Length(CheckString3);
  794.   CheckString2 := First_Element + ' ' + Second_Element;
  795.   Len2 := Length(CheckString2);
  796.   InArray := false;
  797.   For Index := 1 to Counter1-1 do
  798.     begin
  799.       if CorrectArray[Counter1] = CorrectArray[Index] then InArray := true
  800.     end;
  801.   If InArray = true then
  802.     begin
  803.       Counter1:= Counter1-1;
  804.       WordCnt1 := WordCnt1+1;
  805.       QUESTCNT := QUESTCNT + 1;
  806.       doloop1:=true;
  807.       writeln;
  808.       writeln('YOU HAVE ALREADY CREATED THIS SENTENCE, TRY AGAIN!');
  809.       writeln
  810.     end
  811.   else
  812.     if((Fourth_Element = '') and (Third_Element = '')and (Len2 < Length(ANSWER1)))
  813.           then
  814.             begin
  815.              GotoXY(1,7);
  816.              writeln('           You used extra elements,spaces or letters, try again.');
  817.              Counter1:= Counter1-1;
  818.              WordCnt1 := WordCnt1+1;
  819.              QUESTCNT := QUESTCNT + 1;
  820.              doloop1:=true
  821.            end
  822.     else
  823.     if ((Fourth_Element = '') and (len3 < Length(ANSWER1)))
  824.        then
  825.        begin
  826.             GotoXY(1,7);
  827.             writeln('           You used extra elements,spaces or letters, try again.');
  828.             Counter1:= Counter1-1;
  829.             WordCnt1 := WordCnt1+1;
  830.             QUESTCNT := QUESTCNT + 1;
  831.             doloop1:=true
  832.        end
  833.        else
  834.        If Len4 < Length(ANSWER1)
  835.        then
  836.          begin
  837.            GotoXY(1,7);
  838.            writeln('           You used extra elements,spaces or letters, try again.');
  839.            Counter1:= Counter1-1;
  840.            WordCnt1 := WordCnt1+1;
  841.            QUESTCNT := QUESTCNT + 1;
  842.            doloop1:=true
  843.         end
  844.      else
  845.      begin
  846.       GotoXY(1,7);
  847.       writeln('                                 CORRECT.');
  848.       Delay(1000);
  849.       GotoXy(1,7);
  850.       ClrEol
  851.     end
  852. end;
  853.  
  854.  
  855.  BEGIN
  856.   Nums:=[1..10];
  857.   EncompassingLoop:=true;
  858.   while EncompassingLoop=true do
  859.   begin
  860.    Doloop := true;
  861.    Doloop1 := true;
  862.    Counter :=0;
  863.    ClrScr;
  864.    GotoXY(1,24);
  865.    write('ä = CtrlA   ü = CtrlU   ö = CtrlO   Ä = AltA   Ü = AltU   Ö = AltO   ß = AltS');
  866.    CreateWindow(1,1,80,11);
  867.    GotoXY(1,1);
  868.    writeln('You will translate the following sentences:');
  869.    writeln('Input lesson number corresponding to Kapitel number: ');
  870.    readln(lesson_number);
  871.    Lesson_number := 'trans'+lesson_number;
  872.    NUM1 :=1;NUM2 :=2;NUM3:=3;NUM4:=4;NUM5:=1;
  873.    make(ROOT);
  874.    recalltree(ROOT);
  875.    Assign (TRANSLATFile, Lesson_number+'.dat');
  876.    Reset(TRANSLATFile);
  877.    WordCnt :=1;
  878.    READLN (TRANSLATFile, Skeleton);
  879.    VOCABULARY[WordCnt]:=skeleton;
  880.      while (skeleton <> SENTINEL)  do
  881.       begin
  882.         WordCnt := WordCnt +1;
  883.         READLN (TRANSLATFile, Skeleton);
  884.         VOCABULARY[WordCnt]:=skeleton;
  885.       end;
  886.       Close(TRANSLATFile);
  887.       WordCnt:=WordCnt-1;
  888.       Counter :=0;
  889.    ClrScr;
  890.    FillChar(NonRepeatArray,SizeOf(NonRepeatArray),0);
  891.    FillChar(CorrectArray,SizeOf(CorrectArray),0);
  892.    Counter1:=0;
  893.    While doloop do
  894.      begin
  895.          doloop1:=true;
  896.          CreateWindow(1,1,80,11);
  897.          GotoXY(1,1);
  898.          ClrScr;
  899.          Randomize;
  900.          repeat
  901.            Y := random(WordCnt)+1;
  902.            Str(Y,QUESTNUM);
  903.           until NonRepeatArray[Y] = 0;
  904.           NonRepeatArray[Y] := 1;
  905.           Word := VOCABULARY[Y];
  906.           Writeln(Word);
  907.           QUESTCNT :=0;
  908.        While doloop1 do
  909.          begin
  910.            PRINTTREE1(WORD,ROOT);
  911.            If QUESTCNT >1 then
  912.              begin
  913.                repeat
  914.                  write('There are ',QUESTCNT,
  915.                  ' answers to this question. How many do you want:');
  916.                  Readln(Answer);
  917.                  val(Answer,Temp,Result);
  918.                  until ((Result = 0) and (Temp in Nums) and (Temp <= QUESTCNT));
  919.                If temp =1 then QUESTCNT :=1 else QUESTCNT := Temp;
  920.                ClrScr;
  921.                GotoXY(1,1);
  922.                writeln(word)
  923.  
  924.              end;
  925.          Repeat
  926.            GotoXY(1,2);
  927.             COUNT := 0;
  928.             num1 := 1; num2 := 2; num3 := 3; num4 := 4; num5 := 5;
  929.             First_Element := '';Second_Element := '';Third_Element := ''; Fourth_Element := '';
  930.            { Fifth_Element := QUESTNUM; }
  931.             Writeln('Input sentence: ');
  932.             GotoXY(1,3);
  933.             HOR := WhereX;
  934.             Inputline(Input);
  935.             Answer1 := Input;
  936.             GotoXY(1,4);
  937.             Writeln('You have the following possibly correct elements in your translation:');
  938.             GotoXY(1,5);
  939.             Parse(Input);
  940.            If isbranch(num1,first_element,num2,second_element,
  941.            num3,third_element,num4,fourth_element,
  942.            Num5,QUESTNUM ,root) then
  943.                 begin
  944.                      Counter1:=Counter1+1;
  945.                      CorrectArray[Counter1] := first_element +' '+second_element+' '+third_element+' '+fourth_element;
  946.                      doloop1 := false;
  947.                      CheckArray;
  948.                      GotoXY(1,8);
  949.                      WRITELN('  TO CONTINUE PRESS ANY KEY EXCEPT "Q". "Q" FOR LIST OF SENTENCES CREATED.');
  950.                      Ch := ReadKey;
  951.                      If ((ch = 'q')or(ch = 'Q')) then begin
  952.                        doloop := false;
  953.                        doloop1:= false;
  954.                        Questcnt := 0
  955.                      end;
  956.                      Writeln;
  957.                      QUESTCNT := QUESTCNT -1;
  958.                    end;
  959.                    ClrScr;
  960.                    GotoXY(1,1);
  961.                    writeln(word);
  962.                  until QUESTCNT <= 0;
  963.  
  964.          end {of inner Doloop};
  965.           Counter := Counter +1;
  966.           If counter  = WordCnt then doloop := false;
  967.           Delay(500);
  968.  
  969.          ClrScr;
  970.      end; {of outer doloop}
  971.      CreateWindow(1,1,80,24);
  972.      ClrScr;
  973.      Writeln('You created ',Counter1,' sentences.');
  974.      Writeln('Press any key to see list of sentences.');
  975.      Writeln('Press Ctrl-S to stop and start scrolling.');
  976.      Ch := ReadKey;
  977.      ClrScr;
  978.      For INDEX := 1 to Counter1 do
  979.        writeln(CorrectArray[INDEX]);
  980.        Writeln('Press any key to continue.');
  981.          Ch := ReadKey;
  982.          ClrScr;
  983.          GotoXY(16,12);
  984.          writeln('TO REPEAT LESSON OR DO ANOTHER LESSON PRESS "P"');
  985.          Ch := ReadKey;
  986.          If ((Ch='p')or(Ch='P'))then
  987.            begin
  988.              EncompassingLoop := true;
  989.              Window(1,1,80,25);
  990.              ClrScr
  991.            end
  992.          else
  993.            begin
  994.              EncompassingLoop :=false;
  995.              ClrScr;
  996.              GotoXY(32,12);
  997.              Writeln('Auf Wiedersehen!')
  998.            end;
  999.  end{of encompassingLoop}
  1000. end.
  1001. end.
  1002.